﻿//-----------------------------------------------------------------------------------------
// <copyright file="SexConverter.cs" company="Jakub Florczyk (www.jakubflorczyk.pl)">
//      Copyright © 2009 Jakub Florczyk (www.jakubflorczyk.pl)
//      http://flakernet.codeplex.com/
// </copyright>
//-----------------------------------------------------------------------------------------

namespace FlakerNET.Converters
{
    using System;
    using Newtonsoft.Json;

    /// <summary>
    /// Sex konwerter do Newtonsoft.Json
    /// </summary>
    internal class SexConverter : JsonConverter
    {
        /// <summary>
        /// Zapisuje reprezentacje JSON obiektu.
        /// </summary>
        /// <param name="writer">Json writer.</param>
        /// <param name="value">Wartość obiektu.</param>
        public override void WriteJson(JsonWriter writer, object value)
        {
            switch ((Sex)value)
            {
                case Sex.Female:
                    writer.WriteValue("f");
                    break;
                case Sex.Male:
                    writer.WriteValue("m");
                    break;
                case Sex.Undefined:
                    writer.WriteValue("u");
                    break;
            }            
        }

        /// <summary>
        /// Odczytuje reprezentacje JSON obiektu.
        /// </summary>
        /// <param name="reader">Json reader.</param>
        /// <param name="objectType">Typ obiektu.</param>
        /// <returns>Wartość obiektu.</returns>
        public override object ReadJson(JsonReader reader, Type objectType)
        {
            string value = (string)reader.Value;
            if (value == "f")
            {
                return Sex.Female;
            }
            else if (value == "m")
            {
                return Sex.Male;
            }
            else
            {
                return Sex.Undefined;
            }
        }

        /// <summary>
        /// Określa czy aktualna instancja może skonwertować podany typ obiektu.
        /// </summary>
        /// <param name="objectType">Typ obiektu.</param>
        /// <returns>Prawda jeżeli instancja może skonwertować podany typ obiektu; w przeciwnym przypadku fałsz.</returns>
        public override bool CanConvert(Type objectType)
        {
            return typeof(Sex).IsAssignableFrom(objectType);
        }
    }
}
